package com.candoit.webapps.pricing.controllers;

import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import com.candoit.webapps.exceptions.SinConsumoPapelMesException;
import com.candoit.webapps.pricing.model.Articulo;
import com.candoit.webapps.pricing.model.Linea;
import com.candoit.webapps.pricing.model.MateriaPrima;
import com.candoit.webapps.pricing.model.TipoLinea;
import com.candoit.webapps.pricing.util.AperturaCostos;
import com.candoit.webapps.pricing.util.QueryUtil;
import com.candoit.webapps.pricing.util.spreadsheet.ReportInSpreadsheet;

@ManagedBean(name = "aperturaMpCtrl")
@RequestScoped
public class AperturaCostosController extends AbstractCostosMateriasPrimas {

	private boolean calculosCostosDICompletos;
	private List<Articulo> articulosDetail = null;
	
	public AperturaCostosController(){
		moneda = QueryUtil.getInstance().getCotizacionMoneda();
		init_matriz_proporcion_criterio_cc();
	}
	
	private void calcularCostosDI(){
		initGastoDirecto();
		initSalarioDirecto();
	}
	
	public List<AperturaCostos> calculateArticulosDetail(List<Linea> lineasSeleccionadas, List<MateriaPrima> papeles, Integer nivel,TipoLinea tipo, Boolean recalculable) throws SinConsumoPapelMesException {
		if (articulosDetail == null){
			if (lineasSeleccionadas == null || lineasSeleccionadas.isEmpty()){
				articulosDetail = QueryUtil.getInstance().getArticulos();
			}else{
				articulosDetail = QueryUtil.getInstance().getArticulosByLineas(lineasSeleccionadas);
			}
			
		}
		List<AperturaCostos> list = new ArrayList<AperturaCostos>();
		for(Articulo a: articulosDetail){
			list.addAll(listCostos(a,papeles,nivel,tipo,recalculable));
		}
		return list;
	}
	public List<Linea> getLineasSeleccionadas() {
		return lineasSeleccionadas;
	}
	public void setLineasSeleccionadas(List<Linea> lineasSeleccionadas) {
		this.lineasSeleccionadas = lineasSeleccionadas;
	}
	public List<AperturaCostos> listCostos(Articulo articulo, List<MateriaPrima> papeles, Integer nivel,TipoLinea tipo, Boolean recalculable) throws SinConsumoPapelMesException{
		this.tipoProductivo = tipo;
		this.setNivelDelNivelProductivo(nivel);
		if(!this.calculosCostosDICompletos){
			calcularCostosDI();
			this.calculosCostosDICompletos = true;
		}
		
		List<AperturaCostos> result = new ArrayList<AperturaCostos>();
		
		if(recalculable == null || recalculable == false){
			return result;
		}
		
		if (articulo != null){
			DecimalFormat fourDForm = new DecimalFormat("#.####");
			Iterator<MateriaPrima> it  = null;
			if (papeles == null || papeles.isEmpty()){
				List<MateriaPrima> list = QueryUtil.getInstance().getMateriaPrimaByPapelActivos();
				it = list.iterator();
			}else{
				it = papeles.iterator();
			}
				while (it.hasNext()){
					MateriaPrima materia = (MateriaPrima) it.next();
					AperturaCostos apertura = new AperturaCostos();
					apertura.setMateria(materia);
					apertura.setArticulo(articulo); 
					Double costoMp = calcularCostoMPArticuloDolar(articulo, materia,false);
					Double scrap = costoMp * 0.10d;
					Double armadoMO = calcularArmadoDolar(articulo);
					costoMp = costoMp + scrap + armadoMO;
					Double costoSalarios = getCostoSalariosDolar(articulo,false);
					
					Double costoDirectoDolar = getCostoDirectoDolar(articulo, false);
					Double costoIndirectoDolar = getCostoIndirectoDolar(articulo.getFormato().getLinea(), false);
					Double costoDetalle = costoDirectoDolar + costoIndirectoDolar;
					apertura.setCostoDetalle(costoDetalle);
					apertura.setCostoTotal(costoMp + costoDetalle + costoSalarios);
					
					DecimalFormat faux = new DecimalFormat("#.##");
					apertura.setCostoMp(moneda.getSimbolo() +" "+fourDForm.format(costoMp)+" ("+ faux.format(costoMp*100/apertura.getCostoTotal()) +"%)");
					apertura.setSueldos(moneda.getSimbolo()+" "+ fourDForm.format(costoSalarios)+" ("+ faux.format(costoSalarios*100/apertura.getCostoTotal()) +"%)");
					apertura.setCostoDetalleMsg(moneda.getSimbolo()+" "+fourDForm.format(apertura.getCostoDetalle())+" ("+ faux.format(apertura.getCostoDetalle()*100/apertura.getCostoTotal()) +"%)");
					
					result.add(apertura);
				}
			
			return result;
		
		}else{
			return null;
		}
	}

	public void exportarAperturaIndustriales(){
		TipoLinea industrial = QueryUtil.getInstance().getTipoLineaById(TipoLinea.INDUSTRIAL);
		exportarApertura(industrial);
	}
	
	public void exportarAperturaArtesanales(){
		TipoLinea artesanal = QueryUtil.getInstance().getTipoLineaById(TipoLinea.ARTESANAL);
		exportarApertura(artesanal);
	}
	
public void exportarApertura(TipoLinea tipoProductivo){
		HSSFWorkbook wb = new HSSFWorkbook();
		
		ReportInSpreadsheet r = new ReportInSpreadsheet();
		List <Articulo> articulos = QueryUtil.getInstance().getArticulos();
		
		/*reporte en la primera hoja sobre materias primas*/
		r.writeReportInSpreadsheet(wb, articulos, tipoProductivo);

		/*reporte en la segunda hoja sobre los gastos productivos y para-productivos*/
		r.writeReportIndustrialDistributionBases(wb, getMatriz_proporcion_criterio_cc());

		/*reporte en la tercera hoja sobre los salarios*/
		r.writeReportSalaries(wb, getMatriz_proporcion_criterio_cc());
		
        HttpServletResponse res = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();   
        res.setContentType("application/vnd.ms-excel");  
        res.setHeader("Content-disposition",  "attachment; filename=test.xls");  
          
          
        try {  
            ServletOutputStream out = res.getOutputStream();  
    
             wb.write(out);  
             out.flush();  
             out.close();  
       } catch (IOException ex) {   
               ex.printStackTrace();  
       }  
          
      FacesContext faces = FacesContext.getCurrentInstance();  
      faces.responseComplete();
      //http://www.docstoc.com/docs/271809/Java---C%C3%B3mo-generar-Hojas-de-Excel-con-Apache-POI
      //http://chuwiki.chuidiang.org/index.php?title=Crear_archivo_Excel_desde_Java_con_POI
	}


}
